package com.peng.sell.service;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.omg.CORBA.TIMEOUT;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

/**
 * redis分布式锁实现同步
 */
@Component
@Slf4j
@Data
@NoArgsConstructor
public class RedisLock {
    @Autowired
    private StringRedisTemplate redisTemplate;
    public static final Integer TIMEOUT = 10*1000;

    public boolean  lock(String key,String val){
        //如果没有线程占用锁，则直接占用锁
        if(redisTemplate.opsForValue().setIfAbsent(key,val)){
            return  true;
        }
        String currentValue = redisTemplate.opsForValue().get(key);
        //如果锁过期了
        if (!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue)< System.currentTimeMillis()){
            //众多线程 只有一个线程可以在第一次替换的时候得到的值是与currentValue相同的，故而只有这一个可以拿到锁
            String oldValue = redisTemplate.opsForValue().getAndSet(key,String.valueOf(System.currentTimeMillis()));
            if(!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)){
                return true;
            }
        }

        return false;

    }

    public void   unLock(String key,String val){
        try {
            String value = redisTemplate.opsForValue().get(key);
            if(!StringUtils.isEmpty(value) && value.equals(val)){
                redisTemplate.opsForValue().getOperations().delete(key);
            }
        }catch (Exception e){
            log.error("【redis分布式解锁】解锁错误：{}",e);
        }


    }
}
